package algocity.modelo;

import java.util.Observable;

import algocity.modelo.entidad.Ciudad;
import algocity.modelo.entidad.Construccion;
import algocity.modelo.entidad.Electricidad;
import algocity.modelo.entidad.Jugador;
import algocity.modelo.entidad.Servicio;

public class ModeloObservable extends Observable {
	
	private Ciudad unaCiudad;
	private Jugador jugador;
	private Servicio servicio;
	private int puntaje = 0;
	private String construccionStr = "";
			
	public ModeloObservable(int tamanio){
		unaCiudad = new Ciudad("YosuerCity");
		unaCiudad.setArea(tamanio, tamanio);
		jugador = new Jugador("Yosuer", 2000);
	}

	public int getModeloDato(Posicion posicion) {
		
		int dato = 0;
		
		if (!unaCiudad.getSuperficie(posicion).ocupado()) {
			if (unaCiudad.getSuperficie(posicion).getDescripcion() == "Agua") dato = 1;
			if (unaCiudad.getSuperficie(posicion).getDescripcion() == "Tierra") {
				if (unaCiudad.getSuperficie(posicion).contieneServicio(new Electricidad(0))) dato = 7;
				else dato = 2;
			}
		} else {
			if (unaCiudad.getConstruccion(posicion).getTipo() == "Residencial") dato = 3;
			if (unaCiudad.getConstruccion(posicion).getTipo() == "PozoDeAgua") dato = 4;
			if (unaCiudad.getConstruccion(posicion).getTipo() == "CentralElectrica") dato = 5;
			if (unaCiudad.getConstruccion(posicion).getTipo() == "Avenida") dato = 6;
			if (unaCiudad.getConstruccion(posicion).getTipo() == "LineaDeTension") dato = 8;
			if (unaCiudad.getConstruccion(posicion).getTipo() == "CentralEolica") dato = 9;
		}
		return dato;
	}
	
	public void setModeloDato(Posicion posicion) throws InstantiationException, IllegalAccessException  {
		if (jugador.usarDinero(100)) {
			agregarConstruccion(posicion);
		}
	}
	
	public void agregarConstruccion(Posicion posicion) throws InstantiationException, IllegalAccessException{
		try {
		Class clase = Class.forName("algocity.modelo.entidad."+construccionStr);
		unaCiudad.construir((Construccion) clase.newInstance(), posicion);
		servicio = null;
		puntaje += 1;
		} catch (ClassNotFoundException e){
			System.out.println("No existe el edificio: /"+ construccionStr+"/");
			//e.printStackTrace();
		} catch (Exception e){
			System.out.println("Otra Clase de error: "+ construccionStr);
			//e.printStackTrace();
		}
		
		setChanged();
		this.notifyObservers();
	}
	
	public void selectEdificio(String tipoEdificio) {
		construccionStr = tipoEdificio;
	}
	
	public void agregarServicio(Posicion posicion){
//		if (servicio != null) {
//			System.out.println("Servicio "+servicio.getClass() + " aniadido en: " + 
//									posicion.getPosX() + "," + posicion.getPosY());
//			unaCiudad.getSuperficie(posicion).agregarServicio(servicio);
//			setChanged();
//	        this.notifyObservers();
//		}
	}
	
	public void selectServicio(String tipoServicio) throws Exception {
		try {
		Class clase = Class.forName("algocity.modelo.entidad."+tipoServicio);
		servicio = (Servicio) clase.newInstance();
		construccionStr = "";
		System.out.println("Servicio seleccionado ");
		} catch (ClassNotFoundException e){
			System.out.println("No existe el edificio: /"+ tipoServicio+"/");
			e.printStackTrace();
		} catch (Exception e){
			System.out.println("Otra Clase de error: "+ tipoServicio);
			e.printStackTrace();
		}
		
	}

	public int getPuntaje() {
		return puntaje;
	}
	
}
